home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Entertainment / MacMud / Mud 4.0 / mapping.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-09-30  |  4.4 KB  |  208 lines  |  [TEXT/MPS ]

  1. #include <string.h>
  2. #ifdef sun
  3. #include <alloca.h>
  4. #endif
  5. #include "config.h"
  6. #include "lint.h"
  7. #include "interpret.h"
  8. #include "object.h"
  9. #include "wiz_list.h"
  10. #include "regexp.h"
  11. #include "exec.h"
  12.  
  13. #if defined(__GNUC__) && !defined(lint)
  14. #define INLINE inline
  15. #else
  16. #define INLINE
  17. #endif
  18.  
  19. extern struct vector *order_alist PROT((struct vector *));
  20. extern struct svalue *insert_alist PROT((struct svalue *key,
  21.                      struct svalue *key_data,
  22.                      struct vector *list));
  23. extern int assoc PROT((struct svalue *key, struct vector *keys));
  24.  
  25. extern struct svalue const0;
  26.  
  27. struct vector *allocate_mapping(v, w)
  28. struct vector *v, *w;
  29. {
  30.     struct vector *m;
  31.  
  32.     m = allocate_array(2);
  33.     m->item[0].u.vec = v;
  34.     m->item[0].type = T_POINTER;
  35.     m->item[1].u.vec = w;
  36.     m->item[1].type = T_POINTER;
  37.     return m;
  38. }
  39.  
  40. void free_mapping(m)
  41. struct vector *m;
  42. {
  43.     free_vector(m);
  44. }
  45.  
  46. struct svalue *get_map_lvalue(m, index, needlval)
  47. struct vector *m;
  48. struct svalue *index;
  49. int needlval;
  50. {
  51.     int i;
  52.  
  53.     i = assoc(index, m->item[0].u.vec);
  54.     if (i < 0) {
  55.     if (needlval) {
  56.         struct vector *v;
  57.  
  58.         /*
  59.          * NOTE: we change the mapping here!
  60.          * (yes, this really should be &const0 - 1. Blame insert_alist)
  61.          */
  62.         v = insert_alist(index, &const0 - 1, m)->u.vec;
  63.         free_vector(m->item[0].u.vec);
  64.         m->item[0].u.vec = v->item[0].u.vec;
  65.         free_vector(m->item[1].u.vec);
  66.         m->item[1].u.vec = v->item[1].u.vec;
  67.         v->item[0].type = T_NUMBER;
  68.         v->item[1].type = T_NUMBER;
  69.         free_vector(v);
  70.  
  71.         i = assoc(index, m->item[0].u.vec);
  72.     } else {
  73.         static struct svalue zero;
  74.  
  75.         /* should not be overwritten, but who knows... */
  76.         zero = const0;
  77.         return &zero;
  78.     }
  79.     }
  80.     return & m->item[1].u.vec->item[i];
  81. }
  82.  
  83. void remove_mapping(m, i)
  84. struct vector *m;
  85. int i;
  86. {
  87.     struct svalue *p, *q;
  88.     int size;
  89.     extern int total_array_size;
  90.  
  91.     /* use old space */
  92.     p = m->item[0].u.vec->item;
  93.     q = m->item[1].u.vec->item;
  94.     free_svalue(&p[i]);
  95.     free_svalue(&q[i]);
  96.     for (size = m->item[0].u.vec->size - 1; i < size; i++) {
  97.     p[i] = p[i + 1];
  98.     q[i] = q[i + 1];
  99.     }
  100.     total_array_size -= sizeof (struct svalue);
  101.     if (m->user)
  102.     m->user->size_array -= 2;
  103.     m->item[0].u.vec->size = size;
  104.     m->item[1].u.vec->size = size;
  105. }
  106.  
  107. struct vector *add_mapping(v, w)
  108. struct vector *v, *w;
  109. {
  110.     v = allocate_mapping(add_array(v->item[0].u.vec, w->item[0].u.vec),
  111.              add_array(v->item[1].u.vec, w->item[1].u.vec));
  112.     w = order_alist(v);
  113.     free_mapping(v);
  114.     return w;
  115. }
  116.  
  117. struct vector *filter_mapping (p, func, ob, extra)
  118.     struct vector *p;
  119.     char *func;
  120.     struct object *ob;
  121.     struct svalue *extra;
  122. {
  123.     struct vector *q, *r;
  124.     struct svalue *v;
  125.     char *flags;
  126.     int cnt,res;
  127.     
  128.     res=0;
  129.     r=0;
  130.     if ( !func || !ob || (ob->flags & O_DESTRUCTED)) {
  131.     return 0;
  132.     }
  133.     if (p->item[0].u.vec->size<1) {
  134.     p = allocate_array(0);
  135.     return allocate_mapping(p, p);
  136.     }
  137.  
  138.     q = p->item[1].u.vec;
  139.     flags=(char *)alloca(q->size+1); 
  140.     for (cnt=0;cnt<q->size;cnt++) {
  141.     flags[cnt]=0;
  142.     push_svalue(&q->item[cnt]);
  143.     if (extra) {
  144.         push_svalue(extra);
  145.         v = apply (func, ob, 2);
  146.     } else {
  147.         v = apply (func, ob, 1);
  148.     }
  149.     if ((v) && (v->type==T_NUMBER)) {
  150.         if (v->u.number) { flags[cnt]=1; res++; }
  151.     }
  152.     }
  153.     q = allocate_array(res);
  154.     r = allocate_array(res);
  155.     if (res) {
  156.     for (cnt = res = 0; res < q->size; cnt++) {
  157.         if (flags[cnt]) {
  158.         assign_svalue_no_free (&q->item[res],
  159.                        &p->item[0].u.vec->item[cnt]);
  160.         assign_svalue_no_free (&r->item[res++],
  161.                        &p->item[1].u.vec->item[cnt]);
  162.         }
  163.     }
  164.     }
  165.     return allocate_mapping(q, r);
  166. }
  167.  
  168. struct vector *map_mapping (arr, func, ob, extra)
  169.     struct vector *arr;
  170.     char *func;
  171.     struct object *ob;
  172.     struct svalue *extra;
  173. {
  174.     struct vector *q, *r;
  175.     struct svalue *v;
  176.     int cnt;
  177.     
  178.     if (arr->size < 1) {
  179.     arr = allocate_array(0);
  180.     return allocate_mapping(arr, arr);
  181.     }
  182.  
  183.     q = arr->item[0].u.vec;
  184.     q = slice_array(q, 0, q->size - 1);
  185.     arr = arr->item[1].u.vec;
  186.     r = allocate_array(arr->size);
  187.     
  188.     for (cnt = 0; cnt < arr->size; cnt++)
  189.     {
  190.     if (ob->flags & O_DESTRUCTED)
  191.         error("object used by map_mapping destructed"); /* amylaar */
  192.     push_svalue(&arr->item[cnt]);
  193.  
  194.     if (extra)
  195.     {
  196.         push_svalue (extra);
  197.         v = apply(func, ob, 2);
  198.     }
  199.     else 
  200.     {
  201.         v = apply(func,ob,1);
  202.     }
  203.     if (v)
  204.         assign_svalue_no_free (&r->item[cnt], v);
  205.     }
  206.     return allocate_mapping(q, r);
  207. }
  208.